package com.dayuanit.dy16.atm.service.impl;

import com.alibaba.fastjson.JSON;
import com.dayuanit.dy16.atm.dto.FlowDTO;
import com.dayuanit.dy16.atm.service.IRedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;

import java.util.Collections;
import java.util.List;

@Component
public class RedisServiceImpl implements IRedisService {

    @Autowired
    private Jedis jedis;

    /**
     *  Redis的key是很讲究的 ，一般会统一命名，大概的格式：
     *  项目:模块:业务:逻辑
     */
    @Override
    public List<FlowDTO> queryTop10Flow(long userId) {
        String top10Flows = jedis.get("atm:flow:top10:" + userId);
        System.out.println("top10Flows=" + top10Flows);

        //json字符串->对象  反序列化
//        JSONObject jsonObject = JSON.parseObject(top10Flows);//如果json字符串是对象 则转成JSONObject
//        JSONArray objects = JSON.parseArray(top10Flows);//如果是json数组 则转成JSONArray
        List<FlowDTO> flowDTOS = JSON.parseArray(top10Flows, FlowDTO.class);


        //2B程序员
//        return (List<FlowDTO>)jsonObject;

        //普通程序员
//        return (List<FlowDTO>)jsonObject == null ? new ArrayList() : (List<FlowDTO>)jsonObject;

        //如果方法返回值是集合，那么当集合为空时，不要返回null，容易产生空指针异常；
        //一般集合为空，我们返回一个空集合代替之，最好不要new一个空集合，推荐使用Collections.EMPTY_LIST。
        //优秀程序员
        return flowDTOS == null ? Collections.EMPTY_LIST : flowDTOS;
    }

    @Override
    public void saveTop10Flow(long userId, List<FlowDTO> flows) {
        String key = "atm:flow:top10:" + userId;
        //对象->json字符串 是 序列化
        jedis.set(key, JSON.toJSONString(flows));
    }

    @Override
    public void expireKey(String key, int ttl) {
        jedis.expire(key, ttl);
    }
}
